#include<iostream>
#include<vector>
#include<string>
#include<chrono>
#include<sw/redis++/redis++.h>
#include<thread>
#include"util.hpp"
using sw::redis::Redis;
using namespace std::chrono_literals;

void test1(Redis& redis)
{
    std::cout<<"lpush and lrange"<<std::endl;
    redis.flushall();

    // 插入单个元素
    redis.lpush("key","111");

    // 插入一组元素，基于初始化列表
    redis.lpush("key",{"222","333","444"});

    // 插入一组元素，基于迭代器
    std::vector<std::string> values = {"555","666","7777"};
    redis.lpush("key",values.begin(),values.end());

    std::vector<std::string> results;
    auto it = std::back_inserter(results);

    // lrange 获取到列表中的元素
    redis.lrange("key",0,-1,it);

    printContainer(results);
}

void test2(Redis& redis)
{
    std::cout<<"rpush"<<std::endl;
    redis.flushall();

    redis.rpush("key","111");

    redis.rpush("key",{"222","333","444"});

    std::vector<std::string> values = {"555","666","777"};
    redis.rpush("key",values.begin(),values.end());

    // 使用lrange来获取
    std::vector<std::string> results;
    auto it = std::back_inserter(results);
    redis.lrange("key",0,-1,it);
    printContainer(results);
}

void test3(Redis& redis)
{
    std::cout<<"lpop and rpop"<<std::endl;
    redis.flushall();

    redis.rpush("key",{"1","2","3","4"});

    auto result = redis.lpop("key");
    if(result)
    {
        std::cout<<"lpop: "<<result.value()<<std::endl;
    }

    result = redis.rpop("key");
    if(result)
    {
        std::cout<<"rpop: "<<result.value()<<std::endl;
    }
}

void test4(Redis& redis)
{
    using namespace std::chrono_literals;
    std::cout<<"blpop"<<std::endl;
    redis.flushall();

    auto result = redis.blpop("key",10s); // 返回哪个值 1. 这个元素属于哪个list（blpop可以监听多个list） 2. 删除的是哪个元素
    if(result)
        std::cout<<"key:"<<result.value().first<<" value:"<<result.value().second<<std::endl;
    else
        std::cout<<"result 无效"<<std::endl;
}

void test5(Redis& redis)
{
    std::cout<<"llen"<<std::endl;
    redis.flushall();

    redis.lpush("key",{"111","222","333"});
    
    long long result = redis.llen("key");
    std::cout<<"length:"<<result<<std::endl;

}

int main()
{
    Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    test5(redis);
    // test3(redis);
    return 0;
}